#Exercicios 8 - Reamostragem e Simulacao

#1) Os palmitos estão distribuídos aleatoriamente na floresta?

#Hipotese nula: os palmitos se distribuem aleatoriamente no espaco.

#1.1 Baixar e ler o arquivo
eutad=read.table("palmadulto.csv", header = T,  as.is=T)

#Conferir os dados
head(eutad)
dim(eutad)
?read.table
str(eutad)
tail(eutad)
summary(eutad)
class(eutad)  #dataframe
#nao precisa transformar em matriz
#eutad=as.matrix(eutad)  #transformei o data frame em matriz

#1.2 Criar objeto para guardar as distancias entre cada individuo
dist=matrix(NA, ncol=102, nrow=102)
dist

#1.3 Calcule a distancia observada entre cada individuo e guarde o resultados em dist:
#O calculo da distancia entre 2 pontos esta relacionada com o calculo da hipotenusa de um triangulo de pitagoras, onde a hipotenusa^2=(x1-x0)^2 + (y1-y0)^2. Como eu quero colocar os dados em uma matriz, eu uso os contadores "i" e "j". Na matriz a posicao [1,2] (linha 1, coluna 2) e = ao valor da posicao [2,1]. Por isso que o contador j, sera (i+1)

for(i in 1:101)
{
  for(j in (i+1):102)
  {
    difx2=(eutad$gx[i]-eutad$gx[j])^2
    dify2=(eutad$gy[i]-eutad$gy[j])^2
    dist[i,j]<-sqrt(difx2 + dify2)
    dist[j,i]<-sqrt(difx2 + dify2)
  }
  
}

#1.4. Verifique o objeto dist e calcule o parametro chamado de distancia media do vizinho mais proximo (MNN):
dist
(nn<-apply(dist, 1, min, na.rm=TRUE))  #em todas as linhas (argumento =1),pegar os menores valores da distancia entre as palmeiras, e remova os NA da matriz dist

(mnn<-mean(nn)) #Calculo da media do observado

#1.5. Crie um vetor resultado, com 1000 NA's, para guardar os valores de cada simulacao.

resultado=rep(NA, 1000)
resultado

#1.6. Guarde o valor da media do observado na primeira posicao de resultado:
resultado[1]=mnn

#1.7. Crie um ciclo com contador (k) que vai de 2 a 1000:
#1.8 Dentro do ciclo:
#1.8.1. Crie o objetos xsim, um vetor com valores amostrados aleatoriamente de uma distribuicao uniforme (comando: runif) de 0 a 320 (o tamanho x da parcela). Lembre-se de sortear a mesmo quantidade de valores que a populaacao de palmito observado:
#1.8.2. Faca o mesmo que no passo anterior e guarde no objeto ysim;
#1.8.3. Como no topico anterior, crie uma matriz para guardar as distancias entre cada valor xy simulados;
#1.8.4. Crie os ciclos para o calculo das distâncias como no topico anterior;
#1.8.5. Guarde o valor da distancia media do vizinho mais proximo dos dados simulados na posicao i do vetor resultado;
for(k in 2:1000)  #1.7  
{
  xsim= runif(n=102, min= 0, max=320)   #1.8.1 # n=numero de observacoes, no meu caso o numero de linhas
  ysim=runif (102,0,320)   #1.8.2

  xy=matrix(NA, ncol=102, nrow=102)  #1.8.3
  
  for(i in 1:101)  #1.8.4
  {
    for(j in (i+1):102)
    {
      difx2=(xsim[i]-xsim[j])^2
      dify2=(ysim[i]-ysim[j])^2
      xy[i,j]<-sqrt(difx2 + dify2)
      xy[j,i]<-sqrt(difx2 + dify2)
    }
  }
  nnsim=apply(xy, 1, min, na.rm=TRUE)
  resultado[k]=mean(nnsim)  #1.8.5
  
}

#1.9. Faca um histograma dos valores simulados e coloque uma linha vermelha vertical na posicao do valor observado;

hist(resultado) 
abline(v = resultado[1], col="red")

#1.10. Calcule a probabilidade do valor MNN observado ser gerado por uma distribuicao espacial aleatoria.
resultado1=resultado - mean(resultado) #centralizei o histograma para o zero
hist(resultado1)
p=sum(abs(resultado1) >=(abs(resultado1[1])))/length(resultado1)
p # p=0.056

#Portanto os palmitos sao distribuidos de forma aleatoria na floresta.

###################

#2) Simulando o teste de uma regressao linear

vert=read.table("vertebrados.txt", sep = ";", dec = ",", header = T,  as.is=T)
head(vert)
tail(vert)
?read.table
str(vert)
summary(vert)

#removendo os NA
vert=na.exclude(vert)
head(vert)

#2.1 Calcular a inclinacao da reta do modelo linear:
mod=lm(log(vert$brain) ~ log(vert$body))
summary(mod)
inc=coef(mod) [[2]]
inc

#2.2 Criar um vetor para guardar o resultado das simulacoes:
inc.sim= rep(NA, 1000)

inc.sim[1]=inc   #Guardei na 1a posicao do vetor o valor da inclinacao da reta
head(inc.sim)

#Simulacao
for(i in 2:1000)
{
  sim_brain=sample(vert$brain)  #2.3 Desordenar o vetor brain
  inc.sim[i]=coef(lm(log(sim_brain) ~ log(vert$body))) [[2]]    #2.4 Calcular a inclinacao da reta para o modelo linear sim_brain ~ body
  
  }
head(vert)
#2.5 Histograma
par(mfrow=c(1,1))
hist(inc.sim)
abline(v=inc.sim[1], col="red")

#2.6 Calcular o valor do p

p=sum(abs(inc.sim)>=inc.sim[1])/length(inc.sim)  #teste unicaudal
p

#A comparacao da media observada com os valores aleatorios mostraram que ha diferenca significativa (p=0.001). Logo, a massa do corpo tem efeito sobre a massa do cerebro.
